#include <iostream>

using std::cout;
using std::endl;

class Foo
{
public:
    Foo():_cnt(0) {}
    
    //函数调用运算符可以重载
    int operator()(int x, int y)
    {
        ++_cnt;
        return x + y;
    }

    int operator()(int x, int y, int z)
    {
        ++_cnt;
        return x + y + z;
    }

    int getCount() const {  return _cnt;    }

private://状态
    int _cnt;
};

int add(int x, int y)
{
    //局部静态变量,初始化只发生在第一次调用add函数时
    //cnt也可以看出是add函数的状态
    //但是它只有一个
    static int cnt = 0;
    ++cnt;
    printf("cnt: %d\n", cnt);
    return x + y;
}

int main()
{
    int a = 1, b = 2, c = 3;
    Foo foo;
    //完整调用形式
    //cout << foo.operator()(a, b) << endl;
    //简化形式
    cout << foo(a, b) << endl;
    cout << add(a, b) << endl;
    cout << add(a, b) << endl;
    //foo本身是一个对象，但又被当成是函数来使用，因此
    //又称为函数对象, 而函数对象中的数据成员被称为函数的状态
    cout << foo(a, b, c) << endl;

    //&foo;
    cout << "foo 作为函数，被调用了" << foo.getCount() << "次"<< endl;

    Foo bar;

    return 0;
}

